package com.ucdb.postofacilwebservice.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.ucdb.postofacilwebservice.entidades.Posto;

public class PostoDAO {
	
	public void cadastrar (Posto p){
		
		Connection con = Conexao.getConnection();
		String sql = "INSERT INTO posto (nome, endereco, cidade, estado, bandeira, latitude, longitude) VALUES (?, ?, ?, ?, ?, ?, ?)";
		
		try{
			PreparedStatement preparador = con.prepareStatement(sql);
			preparador.setString(1, p.getNome());
			preparador.setString(2, p.getEndereco());
			preparador.setString(3, p.getCidade());
			preparador.setString(4, p.getEstado());
			preparador.setString(5, p.getBandeira());
			preparador.setDouble(9, p.getLatitude());
			preparador.setDouble(10, p.getLongitude());
			
			preparador.execute();
			preparador.close();
			con.close();
			System.out.println("Usuario cadastrado!");
		}catch(SQLException e){
			System.out.println("Erro de sql "+ e.getMessage());
		}
		
	}
	
	public void alterar(Posto p){
		Connection con = Conexao.getConnection();
		String sql = "UPDATE posto SET nome=?, endereco=?, cidade=?, estado=?, bandeira=?, latitude=?, longitude=? WHERE codigo=?";
		
		try{
			PreparedStatement preparador = con.prepareStatement(sql);
			preparador.setString(1, p.getNome());
			preparador.setString(2, p.getEndereco());
			preparador.setString(3, p.getCidade());
			preparador.setString(4, p.getEstado());
			preparador.setString(5, p.getBandeira());
			
			preparador.setDouble(6, p.getLatitude());
			preparador.setDouble(7, p.getLongitude());
			preparador.setInt(8, p.getCodigo());
			preparador.execute();
			preparador.close();
			con.close();
			System.out.println("Alterado com sucesso!");
		}catch(SQLException e){
			System.out.println("Erro de sql "+ e.getMessage());
		}
	}
	
	public void excluir(Posto p){
		Connection con = Conexao.getConnection();
		String sql = "DELETE FROM posto WHERE codigo=?";
		
		try{
			PreparedStatement preparador = con.prepareStatement(sql);
			preparador.setInt(1, p.getCodigo());
			preparador.execute();
			preparador.close();
			con.close();
			
			System.out.println("Excluido com sucesso!");
		}catch(SQLException e){
			System.out.println("Erro de sql "+ e.getMessage());
		}
	}
	
	public Posto buscarPorId(int codigo){
		Connection con = Conexao.getConnection();
		Posto pRetorno = null;
		String sql = "SELECT * FROM posto WHERE codigo=?";
		
		try{
			PreparedStatement preparador = con.prepareStatement(sql);
			preparador.setInt(1, codigo);
			
			ResultSet resultado = preparador.executeQuery();
			
			if(resultado.next()){
				pRetorno = new Posto();
				pRetorno.setCodigo(resultado.getInt("codigo"));
				pRetorno.setNome(resultado.getString("nome"));
				pRetorno.setEndereco(resultado.getString("endereco"));
				pRetorno.setCidade(resultado.getString("cidade"));
				pRetorno.setEstado(resultado.getString("estado"));
				
				pRetorno.setBandeira(resultado.getString("bandeira"));
				pRetorno.setLatitude(resultado.getDouble("latitude"));
				pRetorno.setLongitude(resultado.getDouble("longitude"));
				System.out.println("Encontrado com sucesso");
			}
			preparador.close();
			con.close();
		}catch(SQLException e){
			System.out.println("Erro de sql "+ e.getMessage());
		}
		return pRetorno;
	}

	public List<Posto> buscarTodos(){
		Connection con = Conexao.getConnection();
		List<Posto> listaRetorno = new ArrayList<Posto>();
		String sql = "SELECT * FROM posto ORDER BY codigo";
		
		try{
			PreparedStatement preparador = con.prepareStatement(sql);
			ResultSet resultado = preparador.executeQuery();
			
			while(resultado.next()){
				Posto pRetorno = new Posto();
				pRetorno.setCodigo(resultado.getInt("codigo"));
				pRetorno.setNome(resultado.getString("nome"));
				pRetorno.setEndereco(resultado.getString("endereco"));
				pRetorno.setCidade(resultado.getString("cidade"));
				pRetorno.setEstado(resultado.getString("estado"));
				
				pRetorno.setBandeira(resultado.getString("bandeira"));
				pRetorno.setLatitude(resultado.getDouble("latitude"));
				pRetorno.setLongitude(resultado.getDouble("longitude"));
				
				listaRetorno.add(pRetorno);
			}
			preparador.close();
			con.close();
			System.out.println("Busca efetuada com sucesso!");
		}catch(SQLException e){
			System.out.println("Erro de sql "+ e.getMessage());
		}
		return listaRetorno;
	}
	
	public List<Posto> buscaPorCoordenada(Double latitude, Double longitude, int distancia){
		Connection con = Conexao.getConnection();
		List<Posto> listaRetorno = new ArrayList<Posto>();
		String sql = "SELECT * FROM calculadistancia("+latitude+","+longitude+","+distancia+")";
		
		try{
			PreparedStatement preparador = con.prepareStatement(sql);
			ResultSet resultado = preparador.executeQuery();
			
			while(resultado.next()){
				Posto pRetorno = new Posto();
				pRetorno.setCodigo(resultado.getInt("codigo"));
				pRetorno.setNome(resultado.getString("nome"));
				pRetorno.setEndereco(resultado.getString("endereco"));
				pRetorno.setCidade(resultado.getString("cidade"));
				pRetorno.setEstado(resultado.getString("estado"));
				
				pRetorno.setBandeira(resultado.getString("bandeira"));
				pRetorno.setLatitude(resultado.getDouble("latitude"));
				pRetorno.setLongitude(resultado.getDouble("longitude"));
				
				listaRetorno.add(pRetorno);
			}
			preparador.close();
			con.close();
			System.out.println("Busca efetuada com sucesso!");
		}catch(SQLException e){
			System.out.println("Erro de sql "+ e.getMessage());
		}
		return listaRetorno;
	}
}
